package com.probiz.estore.order.service;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

import com.probiz.estore.common.model.order.OrderShipment;
import com.probiz.estore.common.model.order.SalesOrder;
import com.probiz.estore.core.search.SearchCriteria;
import com.probiz.estore.core.service.GenericManager;
import com.probiz.estore.order.model.OrderSearchCriteria;

public interface SalesOrderManager extends GenericManager<SalesOrder> {
	
	
	 /**
     * 搜索订单
     *
     * @param orderSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 搜索结果
     */
    public List<SalesOrder> searchByCriteria(OrderSearchCriteria orderSearchCriteria, SearchCriteria searchCriteria);

    /**
     * 搜索订单，从GenericController借鉴过来。防止翻页过钱
     *
     * @param orderSearchCriteria 自定义搜索条件
     * @param searchCriteria        分页搜索条件
     * @return 搜索结果
     */
    public List<SalesOrder> searchByCriteriaForController(OrderSearchCriteria orderSearchCriteria, SearchCriteria searchCriteria);
    
    /**
     * 根据订单号获取订单
     * @param orderNo
     * @return
     */
    public SalesOrder getSalesOrderByOrderNo(String orderNo);
    
    
    /**
	 * 返回指定会员的订单数
	 * @param userId
	 * @return
	 */
	public long countCustomerOrder(Integer userId);
	
	/**
	 * 返回指定会员的订单数（可指定状态）
	 * @param userId
	 * @return
	 */
	public long countCustomerOrder(Integer userId, Short orderStatus);
	
	/**
	 * 计算会员在指定日期范围内的消费总金额
	 * @param userId
	 * @param startDate	计算的起止日期（为NULL即计算的开始时间没有上限）
	 * @param endDate	计算的终止日期（为NULL即计算的结束时间没有下限）
	 * @return
	 */
	public BigDecimal getCustomerConsumption(Integer userId, Date startDate, Date endDate);
	
	/**
	 * 发送下达订单通知邮件
	 * @param salesOrder
	 */
	public void sendEmail4PlaceOrder(SalesOrder salesOrder);
	
	/**
	 * 发送发货通知邮件
	 * @param salesOrder
	 * @param orderShipment
	 */
	public void sendEmail4Ship(SalesOrder salesOrder,OrderShipment orderShipment);
	
	
	
	/**
	 * 统计未确认的订单
	 * @return
	 */
	public Long countNewArrivalOrder();
	
	/**
	 * 获取最新的订单
	 * @param salesOrder
	 * @return
	 */
	public SalesOrder getLastSalesOrder(Integer  customerId);
	/**
	 * 统计未支付订单(前台)
	 * @param customerId
	 * @return
	 */
	public Long countUnPaidSalesOrder(Integer customerId);
	
	/**
	 * 统计订单总量-用于后台面板
	 */
	public Long countOrderTotal();
	
	
	
	/**
	 * 根据商品id和订单状态获得订单数量
	 * @param productId
	 * @param orderStatuses 如果为空表示任意状态
	 * @return
	 */
	public Long countOrderTotalByProductIdByOrderStatuses(Integer productId,Short[] orderStatuses);
	
	/**
	 * 根据货品id和订单状态获得订单数量
	 * @param productId
	 * @param orderStatuses 如果为空表示任意状态
	 * @return
	 */
	public Long countOrderTotalByProductSkuIdByOrderStatuses(Integer productSkuId,Short[] orderStatuses);
	
	
	/**
	 * 订单导出 FOR EAI
	 * @param latestExportTime 最近一次导出时间
	 * @return 需要导出的订单列表
	 */
	public List<SalesOrder> getSalesOrder4Export(Date latestExportTime);
	
	
	
	/**
	 * 根据订单号获得订单个数
	 * @return
	 */
	public Long getSizeByOrderNo(String orderNo);
	
	/**
	 * 根据礼品id和订单状态获得订单数量
	 * @param giftId
	 * @param orderStatuses 如果为空表示任意状态
	 * @return
	 */
	public Long countOrderTotalByGiftIdByOrderStatuses(Integer giftId, Short[] orderStatuses);
	
	
}
